iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
0

先來個簡單範例

 class Info {

     var id: Int=0
     var name: String=""
     var number: String=""
     fun printNnumber(){
         println("***** $number")
     }
 }

這邊介紹幾個常用的用法

  • with
  • run、T.run
  • let、T.let
  • apply、T.apply
  • also、T.also

T是泛指變數或物件,在後方使用run、with等方法

run & T.run


可以將 run 視作是一個封閉的執行範圍, 但是run 會把最後一行的東西傳出或是帶到下一個關連使用

run

舉個例子

run{
    var InfoA=Info()
    InfoA.id=1
    InfoA.name="Apple2"
    InfoA.number="123456"
    var newNumber="456789"
    InfoA.number=newNumber
    InfoA
}.printNnumber()

在run裡面可以建立本地變數newNumber,這個變數只存在於run的範圍內,外部無法操作。
在run執行完畢後,我們發現有執行printNnumber()函式,那是因為最後一行傳出InfoA時,此時可以使用Info內的函式方法。

T.run

var InfoA:Info?=null
var InfoB=InfoA?.run{
    this.id=1
    this.name="Apple2"
    this.number="123456"
    var newNumber="456789"
    this.number=newNumber
    this
}
InfoB?.printId()
InfoB?.printNumber()
InfoB?.printName()

run的最後一行會被傳出,所以變數InfoB的型態就被指定為InfoA,並且擁有在run裡面所設定的值。

T.run可以判斷空值操作,如果為空值則後方的run就不執行。
如果不為空值,藉由T.run最後一行傳回this,讓InfoB去使用時,此時InfoB會被轉型成InfoA?。

因此使用Info內函式時,都需要加上?去作空值的安全檢查。

run內部用this來作操作。

with


var InfoB:Info?=null
var InfoB=with(Info()){
    this.id=1
    this.name="Apple2"
    this.number="123456"
    this
}
InfoB?.printId()
InfoB?.printNumber()
InfoB?.printName()

with沒有T.with的用法。

大致上跟run的用法差不多,一樣是回傳範圍內最後一行,內部也是用this。
差異在使用with時,需要傳入變數,而這變數一樣有需要空值的安全性檢查。


到這邊,有沒有發現this這個詞很眼熟?

沒錯,在kotlin我們對this有另一個用法,像是要存取context、activity等,通常都會寫成this.context,this.activity。

這樣我們在這些範圍內的存取,又該怎麼宣告?

this@MainActivity

使用@後方接對象來區分。


let & T.let


如果要避免this的用法造成困擾,我們可以使用let。

let{
    var InfoC=Info()
    InfoC.id=3
    InfoC.name="Cindy"
    InfoC.number="9876554"
    InfoC
}.printNumber()
var InfoC=Info().let{
    it.id=3
    it.name="Cindy"
    it.number="9876554"
    it
}

這邊內部使用的就是it,其他的部分都跟run、with用法一樣,回傳範圍內最後一項。

also & T.also


var InfoD=Info().also{
    it.id=4
    it.name="Dina"
    it.number="999999"
}

T.also,沒有回傳最後一項的用法,他會將also自身傳回去,一樣使用it來操作。

apply & T.apply


如果說,我們有點想念this的用法,又想要用also的方式..

var InfoE=Info().apply{
    this.id=5
    this.name="Eva"
    this.number="888888"
}
InfoE.printName()

我們還有一個叫apply的用法可以用。
一樣回傳自身,使用this操作...

那麼歸納用法吧

  1. 判斷是要回傳範圍最後一項還是自身
  2. 判斷需求是否為extension function (T.系列)
  3. 使用it 或 this操作

上一篇
Jsoup x Kotlin 靜態處理JavaScript取得內容
下一篇
超簡單 Gson 使用法
系列文
跟Kotlin一起來聊Android元件 或許還有應用,或許還有一些資訊雜談30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言